package com.wbs.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.wbs.mapper.TbTypeTemplateMapper;
import com.wbs.model.TbTypeTemplate;
import com.wbs.model.TbTypeTemplateExample;
import com.wbs.resutil.PageBean;
import com.wbs.resutil.PageResult;
import com.wbs.service.TypeTemplateService;
import com.wbs.vo.TypeTemplateVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: 芝梦
 * @Description: 类型模板服务的实现类，提供类型模板相关业务逻辑处理。
 *              在服务层添加try/catch可以记录更详细的日志信息或执行一些清理操作。
 *              但如果日志记录和监控在其他层（如控制器层或集中化异常处理器中）已经足够，
 *              那么服务层可能不需要额外的try/catch。
 * @DateTime: 2024/1/25 16:41
 */
@Service
public class TypeTemplateServiceImpl implements TypeTemplateService {

    private final TbTypeTemplateMapper tbTypeTemplateMapper;

    @Autowired
    public TypeTemplateServiceImpl(TbTypeTemplateMapper tbTypeTemplateMapper) {
        this.tbTypeTemplateMapper = tbTypeTemplateMapper;
    }

    @Override
    public PageResult<TypeTemplateVo> findTypeTemplatePage(PageBean<TypeTemplateVo> pageBean) {
        // 设置分页参数
        PageHelper.startPage(pageBean.getPageNum(), pageBean.getPageSize());
        // 模糊查询 调用查询条件 方法 buildExample()
        List<TbTypeTemplate> tbTypeTemplates = tbTypeTemplateMapper.selectByExample(buildExample(pageBean.getBean()));

        PageInfo<TbTypeTemplate> pageInfo = new PageInfo<>(tbTypeTemplates);
        //实体类列表转换 List<TbTypeTemplate> -> List<TypeTemplateVo> 调佣类型列表转换方法convertToVoList()
        List<TypeTemplateVo> voList = convertToVoList(pageInfo.getList());

        return new PageResult<>(pageInfo.getPageNum(), pageInfo.getPageSize(), pageInfo.getTotal(), voList);
    }

    @Override
    public TypeTemplateVo selectByKey(Long id) {
        TbTypeTemplate tbTypeTemplate = tbTypeTemplateMapper.selectByPrimaryKey(id);
        // TbTypeTemplate 转换 TypeTemplateVO 方法
        return convertToVo(tbTypeTemplate);
    }

    @Override
    public void add(TypeTemplateVo typeTemplateVo) {
        //TypeTemplateVO 转换 TbTypeTemplate 方法
        tbTypeTemplateMapper.insertSelective(this.convertToTb(typeTemplateVo));
    }

    @Override
    public void update(TypeTemplateVo typeTemplateVo) {
        tbTypeTemplateMapper.updateByPrimaryKeySelective(this.convertToTb(typeTemplateVo));
    }

    @Override
    public void delete(Long id) {
        tbTypeTemplateMapper.deleteByPrimaryKey(id);
    }


    /*以下是辅助方法 ----------------------------------------------------------  */
    // 构建查询条件的辅助方法 通过模板名称查询
    private TbTypeTemplateExample buildExample(TypeTemplateVo criteria) {
        TbTypeTemplateExample example = new TbTypeTemplateExample();
        if (criteria != null && criteria.getName() != null) {
            example.createCriteria().andNameLike("%" + criteria.getName() + "%");
        }
        return example;
    }

    // 实体列表转换为VO列表的辅助方法
    //(this::convertToVo) == (tbTypeTemplate) -> this.convertToVo(tbTypeTemplate)
    //this 指的是 TypeTemplateServiceImpl 类的当前实例 用于调用当前类的方法
    private List<TypeTemplateVo> convertToVoList(List<TbTypeTemplate> tbTypeTemplates) {
        return tbTypeTemplates.stream()
                .map((tbTypeTemplate) -> this.convertToVo(tbTypeTemplate))
                .collect(Collectors.toList());
    }

    // TbTypeTemplate 转换 TypeTemplateVO 方法
    private TypeTemplateVo convertToVo(TbTypeTemplate tbTypeTemplate) {
        TypeTemplateVo typeTemplateVo = new TypeTemplateVo();
        BeanUtils.copyProperties(tbTypeTemplate, typeTemplateVo);
        return typeTemplateVo;
    }

    // TypeTemplateVO 转换 TbTypeTemplate 方法
    private TbTypeTemplate convertToTb(TypeTemplateVo typeTemplateVo) {
        TbTypeTemplate tbTypeTemplate = new TbTypeTemplate();
        BeanUtils.copyProperties(typeTemplateVo, tbTypeTemplate);
        return tbTypeTemplate;
    }
}
